Python์ tempfile ๋ชจ๋์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ก, ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ ์์ฑ, ์์ ํ ์ฒ๋ฆฌ ๋ฐ ํ๋ซํผ ๊ฐ ํธํ์ฑ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
Tempfile ๋ชจ๋: Python์์ ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ ๊ด๋ฆฌ
Python์ tempfile
๋ชจ๋์ ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์
๋๋ค. ํ์ผ ์์คํ
์ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ์ง ์๊ณ ํ๋ก๊ทธ๋จ ์คํ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ์ ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ, ํ
์คํธ ํ๋ ์์ํฌ ๋ฐ ์
๋ก๋ ๋๋ ์ค๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์ ์ ์ฅ์ด ํ์ํ ์น ์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๊ฐ์ ์๋๋ฆฌ์ค์์ ํนํ ์ ์ฉํฉ๋๋ค.
Tempfile ๋ชจ๋์ ์ฌ์ฉํ๋ ์ด์
- ์๋ ์ ๋ฆฌ:
tempfile
๋ชจ๋์ ๋ ์ด์ ํ์ํ์ง ์์ ์์ ํ์ผ๊ณผ ๋๋ ํฐ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ญ์ ํ์ฌ ๋์คํฌ ๊ณต๊ฐ ๋ญ๋น์ ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ๋ฐฉ์งํฉ๋๋ค. - ์์ ํ ์์ฑ: ์์ ํ์ผ๊ณผ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ ํ๊ฒ ์์ฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๊ฒฝํฉ ์ํ ๋ฐ ๋ฌด๋จ ์ก์ธ์ค ์ํ์ ์ต์ํํฉ๋๋ค.
- ํ๋ซํผ ๋ ๋ฆฝ์ฑ: ์ด ๋ชจ๋์ ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ ์ฒ๋ฆฌ์์ ํ๋ซํผ๋ณ ์ฐจ์ด์ ์ ์ถ์ํํ์ฌ ์ฝ๋๋ฅผ ๋์ฑ ์ด์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
- ๊ฐ์ํ๋ ๊ด๋ฆฌ: ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑ, ์ก์ธ์ค ๋ฐ ์ญ์ ํ๋ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ์ฌ ์ฝ๋ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํต๋๋ค.
ํต์ฌ ๊ธฐ๋ฅ
์์ ํ์ผ ์์ฑ
tempfile
๋ชจ๋์ ์์ ํ์ผ์ ์์ฑํ๊ธฐ ์ํ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ธฐ๋ฅ์ tempfile.TemporaryFile()
๋ก, ๋ซ์ ๋ ์๋์ผ๋ก ์ญ์ ๋๋ ์์ ํ์ผ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
์์: ๊ธฐ๋ณธ ์์ ํ์ผ ์์ฑ
import tempfile
with tempfile.TemporaryFile(mode='w+t') as temp_file:
temp_file.write('Hello, temporary world!')
temp_file.seek(0)
content = temp_file.read()
print(content)
# 'with' ๋ธ๋ก์ด ์ข
๋ฃ๋๋ฉด ํ์ผ์ด ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
์ด ์์์์๋ ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ชจ๋(w+t
)๋ก ์์ ํ์ผ์ ์์ฑํฉ๋๋ค. with
๋ธ๋ก์ด ์ข
๋ฃ๋๋ฉด ํ์ผ์ด ์๋์ผ๋ก ์ญ์ ๋์ด ์์ ํ์ผ์ด ๋จ์ง ์๋๋ก ํฉ๋๋ค. seek(0)
๋ฉ์๋๋ ํ์ผ ํฌ์ธํฐ๋ฅผ ์ฒ์์ผ๋ก ์ฌ์ค์ ํ์ฌ ๋ฐฉ๊ธ ์ด ๋ด์ฉ์ ์ฝ์ ์ ์๋๋ก ํฉ๋๋ค.
TemporaryFile
ํจ์๋ ๋ค์์ ํฌํจํ์ฌ ์ฌ๋ฌ ์ ํ์ ์ธ์๋ฅผ ํ์ฉํฉ๋๋ค.
mode
: ํ์ผ ๋ชจ๋(์: ์ฝ๊ธฐ-์ฐ๊ธฐ ํ ์คํธ ๋ชจ๋์ ๊ฒฝ์ฐ'w+t'
, ์ฝ๊ธฐ-์ฐ๊ธฐ ๋ฐ์ด๋๋ฆฌ ๋ชจ๋์ ๊ฒฝ์ฐ'w+b'
)๋ฅผ ์ง์ ํฉ๋๋ค.buffering
: ๋ฒํผ๋ง ์ ์ฑ ์ ์ ์ดํฉ๋๋ค.encoding
: ํ ์คํธ ํ์ผ์ ์ธ์ฝ๋ฉ(์:'utf-8'
)์ ์ง์ ํฉ๋๋ค.newline
: ๊ฐํ ๋ณํ์ ์ ์ดํฉ๋๋ค.suffix
: ์์ ํ์ผ ์ด๋ฆ์ ์ ๋ฏธ์ฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.prefix
: ์์ ํ์ผ ์ด๋ฆ์ ์ ๋์ฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.dir
: ์์ ํ์ผ์ ์์ฑํ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํฉ๋๋ค.None
์ธ ๊ฒฝ์ฐ ์์คํ ์ ๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์์: ์ ๋ฏธ์ฌ์ ์ ๋์ฌ๊ฐ ์๋ ์์ ํ์ผ ์์ฑ
import tempfile
with tempfile.TemporaryFile(suffix='.txt', prefix='temp_', dir='/tmp', mode='w+t') as temp_file:
temp_file.write('This is a temporary text file.')
print(temp_file.name) # ํ์ผ ์ด๋ฆ ์ถ๋ ฅ(์: /tmp/temp_XXXXXX.txt)
# 'with' ๋ธ๋ก์ด ์ข
๋ฃ๋๋ฉด ํ์ผ์ด ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
์ด ์์์์๋ .txt
์ ๋ฏธ์ฌ์ temp_
์ ๋์ฌ๋ฅผ ์ฌ์ฉํ์ฌ /tmp
๋๋ ํฐ๋ฆฌ(Unix ๊ณ์ด ์์คํ
์ ๊ฒฝ์ฐ)์ ์์ ํ์ผ์ ์์ฑํฉ๋๋ค. Windows์์๋ `C:\Temp`์ ๊ฐ์ ์ ์ ํ ์์ ๋๋ ํฐ๋ฆฌ๊ฐ ํ๋ซํผ ๊ฐ ํธํ์ฑ ํ
์คํธ ๋ฐ ๋ฐฐํฌ์ ๋ ์ ํฉํฉ๋๋ค. ์ค์ ์ด๋ฆ์๋ ๊ณ ์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์์๋ก ์์ฑ๋ ๋ฌธ์(XXXXXX
๋ก ํ์๋จ)๊ฐ ํฌํจ๋ฉ๋๋ค.
์ด๋ฆ์ด ์ง์ ๋ ์์ ํ์ผ ์์ฑ
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ์ก์ธ์คํ ์ ์๋ ์๋ ค์ง ์ด๋ฆ์ ์์ ํ์ผ์ด ํ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด tempfile.NamedTemporaryFile()
ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์: ์ด๋ฆ์ด ์ง์ ๋ ์์ ํ์ผ ์์ฑ
import tempfile
with tempfile.NamedTemporaryFile(delete=False, suffix='.txt', prefix='named_') as temp_file:
temp_file.write('This is a named temporary file.')
file_name = temp_file.name
print(f'File created: {file_name}')
# delete=False์ด๋ฏ๋ก ํ์ผ์ด ์๋์ผ๋ก ์ญ์ ๋์ง ์์ต๋๋ค.
# ์๋ฃ๋๋ฉด ์๋์ผ๋ก ์ญ์ ํด์ผ ํฉ๋๋ค.
import os
os.remove(file_name) # ํ์ผ์ ์๋์ผ๋ก ์ญ์ ํฉ๋๋ค.
print(f'File deleted: {file_name}')
์ค์: ๊ธฐ๋ณธ์ ์ผ๋ก NamedTemporaryFile()
์ ๋ซํ ๋ ํ์ผ์ ์ญ์ ํ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด(๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ก์ธ์คํ ์ ์๋๋ก ํ์ฉ) delete=False
๋ก ์ค์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์๋ฃ๋๋ฉด os.remove()
์ ์ฌ์ฉํ์ฌ ํ์ผ์ ์๋์ผ๋ก ์ญ์ ํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ์ง ์์ผ๋ฉด ์์ ํ์ผ์ด ์์คํ
์ ๋จ์ ์๊ฒ ๋ฉ๋๋ค.
์์ ๋๋ ํฐ๋ฆฌ ์์ฑ
tempfile
๋ชจ๋์ ์ฌ์ฉํ๋ฉด tempfile.TemporaryDirectory()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค.
์์: ์์ ๋๋ ํฐ๋ฆฌ ์์ฑ
import tempfile
with tempfile.TemporaryDirectory() as temp_dir:
print(f'Temporary directory created: {temp_dir}')
# temp_dir ๋ด์์ ํ์ผ๊ณผ ํ์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
import os
file_path = os.path.join(temp_dir, 'my_file.txt')
with open(file_path, 'w') as f:
f.write('This is a file in the temporary directory.')
# 'with' ๋ธ๋ก์ด ์ข
๋ฃ๋๋ฉด ๋๋ ํฐ๋ฆฌ์ ํด๋น ๋ด์ฉ์ด ์๋์ผ๋ก ์ญ์ ๋ฉ๋๋ค.
TemporaryDirectory()
ํจ์๋ with
๋ธ๋ก์ด ์ข
๋ฃ๋ ๋ ํด๋น ๋ด์ฉ๊ณผ ํจ๊ป ์๋์ผ๋ก ์ญ์ ๋๋ ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์์ ๋๋ ํฐ๋ฆฌ ๋ด์ ํ์ผ์ด๋ ํ์ ๋๋ ํฐ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์์ ๋๋ ํฐ๋ฆฌ๊ฐ ๋จ์ง ์์ต๋๋ค.
TemporaryFile
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก TemporaryDirectory
๋ suffix
, prefix
๋ฐ dir
์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ ํฐ๋ฆฌ ์ด๋ฆ๊ณผ ์์น๋ฅผ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ
tempfile.gettempdir()
์ ์ฌ์ฉํ์ฌ ์์คํ
์ ๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ์ ์์น๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์์: ๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ
import tempfile
temp_dir = tempfile.gettempdir()
print(f'Default temporary directory: {temp_dir}')
์ด ํจ์๋ dir
์ธ์๋ฅผ ๋ช
์์ ์ผ๋ก ์ง์ ํ์ง ์์ ๊ฒฝ์ฐ ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๊ฐ ์์ฑ๋ ์์น๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
์ฌ์ฉ์ ์ง์ ์์ ๋๋ ํฐ๋ฆฌ ์์น ์ ํ
๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ๊ฐ ํญ์ ์์ ํ์ผ์ ๊ฐ์ฅ ์ ํฉํ ์์น๋ ์๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ๋น ๋ฅธ ์ ์ฅ ์ฅ์น์ ๋๋ ํฐ๋ฆฌ ๋๋ ํน์ ๊ถํ์ด ์๋ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ์ ์์ต๋๋ค. ๋ค์์ ํฌํจํ์ฌ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก tempfile
๋ชจ๋์ด ์ฌ์ฉํ๋ ์์น์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
dir
์ธ์: ์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผTemporaryFile
,NamedTemporaryFile
๋ฐTemporaryDirectory
์dir
์ธ์๋ฅผ ์ ๋ฌํ์ฌ ์ฌ์ฉํ ์ ํํ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฐ์ฅ ๋ช ์์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค.- ํ๊ฒฝ ๋ณ์:
tempfile
๋ชจ๋์ ์ฌ๋ฌ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฐธ์กฐํ์ฌ ์์ ๋๋ ํฐ๋ฆฌ ์์น๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ฐ์ ์์๋ ์ผ๋ฐ์ ์ผ๋กTMPDIR
,TEMP
,TMP
์์ ๋๋ค. ์ด ์ค ์ด๋ ๊ฒ๋ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ํ๋ซํผ๋ณ ๊ธฐ๋ณธ๊ฐ(์: Unix ๊ณ์ด ์์คํ ์/tmp
๋๋ Windows์C:\Users\
)์ด ์ฌ์ฉ๋ฉ๋๋ค.\AppData\Local\Temp tempfile.tempdir
์ค์ :tempfile.tempdir
์์ฑ์ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก๋ก ์ง์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉดtempfile
๋ชจ๋์ ๋ชจ๋ ํ์ ํธ์ถ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ค์ค ์ค๋ ๋ ๋๋ ๋ค์ค ํ๋ก์ธ์ค ํ๊ฒฝ์์๋ ๊ฒฝํฉ ์ํ ๋ฐ ์์ธกํ ์ ์๋ ๋์์ ์ ๋ฐํ ์ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋์ง ์์ต๋๋ค.
์์: TMPDIR
ํ๊ฒฝ ๋ณ์ ์ฌ์ฉ(Linux/macOS)
import os
import tempfile
os.environ['TMPDIR'] = '/mnt/fast_ssd/temp'
with tempfile.TemporaryFile() as temp_file:
print(temp_file.name) # /mnt/fast_ssd/temp์ ์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
์์: TEMP
ํ๊ฒฝ ๋ณ์ ์ค์ (Windows)
import os
import tempfile
os.environ['TEMP'] = 'D:\Temp'
with tempfile.TemporaryFile() as temp_file:
print(temp_file.name) # D:\Temp์ ์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
์ฃผ์: ํ๊ฒฝ ๋ณ์ ๋๋ tempfile.tempdir
์ ์์ ํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ๋ค๋ฅธ ๋ถ๋ถ์ด๋ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์ด ๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ์ ์์กดํ๋ ๊ฒฝ์ฐ ์๋ํ์ง ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฃผ์ํด์ ์ฌ์ฉํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ๋ช
ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค.
๋ณด์ ๊ณ ๋ ค ์ฌํญ
์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๋ ๋ณด์ ์ธก๋ฉด์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. tempfile
๋ชจ๋์ ์ ์ฌ์ ์ํ์ ์ํํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ์์ ํ ์์ฑ: ์ด ๋ชจ๋์ ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ํด ์์ ํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๊ณต๊ฒฉ์๊ฐ ํ๋ก๊ทธ๋จ์ด ์ํํ๊ธฐ ์ ์ ์์ ํ์ผ์ ์์ฑํ๊ฑฐ๋ ์กฐ์ํ ์ ์๋ ๊ฒฝํฉ ์ํ์ ์ํ์ ์ต์ํํฉ๋๋ค.
- ์์ ์ด๋ฆ: ๊ณต๊ฒฉ์๊ฐ ํด๋น ์์น๋ฅผ ์ถ์ธกํ๊ธฐ ์ด๋ ต๋๋ก ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ์๋ ์์ ์ด๋ฆ์ด ์ง์ ๋ฉ๋๋ค.
- ์ ํ๋ ๊ถํ: Unix ๊ณ์ด ์์คํ
์์ ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ ๊ถํ(์: ํ์ผ์ ๊ฒฝ์ฐ
0600
, ๋๋ ํฐ๋ฆฌ์ ๊ฒฝ์ฐ0700
)์ผ๋ก ์์ฑ๋์ด ์์ ์์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ํํฉ๋๋ค.
ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ฌ์ ํ ์์์ผ ํฉ๋๋ค.
- ์์ธก ๊ฐ๋ฅํ ์ด๋ฆ ์ฌ์ฉ ๊ธ์ง: ์์ ํ์ผ ๋๋ ๋๋ ํฐ๋ฆฌ์ ์์ธก ๊ฐ๋ฅํ ์ด๋ฆ์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
tempfile
๋ชจ๋์์ ์ ๊ณตํ๋ ์์ ์ด๋ฆ ์์ฑ์ ์ฌ์ฉํ์ญ์์ค. - ๊ถํ ์ ํ: ๋ค๋ฅธ ์ฌ์ฉ์ ๋๋ ํ๋ก์ธ์ค์ ์์ ํ์ผ ๋๋ ๋๋ ํฐ๋ฆฌ์ ๋ํ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํด์ผ ํ๋ ๊ฒฝ์ฐ ์ค์ ํ๋ ๊ถํ์ ๋งค์ฐ ์ฃผ์ํ์ญ์์ค. ์ต์ ํ์ ๊ถํ์ ๋ถ์ฌํ๊ณ ๋ณด๋ค ์ธ๋ถํ๋ ์ ์ด๋ฅผ ์ํด ์ก์ธ์ค ์ ์ด ๋ชฉ๋ก(ACL)์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ ๋ ฅ ์ญ์ : ์ธ๋ถ ์์ค(์: ์ฌ์ฉ์ ์ ๋ก๋)์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์ ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ์ฑ ์ฝ๋๊ฐ ์์ ํ์ผ์ ๊ธฐ๋ก๋์ง ์๋๋ก ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํด์ผ ํฉ๋๋ค.
- ์์ ํ๊ฒ ํ์ผ ์ญ์ :
tempfile
๋ชจ๋์ ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ญ์ ํ์ง๋งNamedTemporaryFile
์delete=False
์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๊ฐ์ด ํ์ผ์ ์๋์ผ๋ก ์ญ์ ํด์ผ ํ๋ ์ํฉ์ด ์์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐos.remove()
ํจ์ ๋๋ ๊ธฐํ ์์ ํ ์ญ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๋์คํฌ์ ๋ฐ์ดํฐ ์์ฌ๋ฌผ์ด ๋จ์ง ์๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ ํ ํ์ผ ์ญ์ ๋ฅผ ์ํด ์กด์ฌํ๋ฉฐ, ํ์ผ์ ์ฐ๊ฒฐ ํด์ ํ๊ธฐ ์ ์ ์ฌ๋ฌ ๋ฒ ๋ฎ์ด์๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก
- ์ปจํ
์คํธ ๊ด๋ฆฌ์ ์ฌ์ฉ(
with
๋ฌธ): ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๋ ํญ์with
๋ฌธ์ ์ฌ์ฉํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋ ํ์ผ๊ณผ ๋๋ ํฐ๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ์๋์ผ๋ก ๋ซํ๊ณ ์ญ์ ๋ฉ๋๋ค. - ์ ์ ํ ํจ์ ์ ํ: ๋ซ์ ๋ ์๋์ผ๋ก ์ญ์ ๋๋ ์ต๋ช
์์ ํ์ผ์ ๊ฒฝ์ฐ
TemporaryFile
์ ์ฌ์ฉํฉ๋๋ค. ๋ค๋ฅธ ํ๋ก์ธ์ค์์ ์ก์ธ์คํ ์ ์๋ ์๋ ค์ง ์ด๋ฆ์ ์์ ํ์ผ์ด ํ์ํ ๊ฒฝ์ฐNamedTemporaryFile
์ ์ฌ์ฉํ์ง๋ง ์๋์ผ๋ก ์ญ์ ํด์ผ ํจ์ ๊ธฐ์ตํ์ญ์์ค. ์๋์ผ๋ก ์ ๋ฆฌํด์ผ ํ๋ ์์ ๋๋ ํฐ๋ฆฌ์ ๊ฒฝ์ฐTemporaryDirectory
๋ฅผ ์ฌ์ฉํฉ๋๋ค. - ํ๋ซํผ ์ฐจ์ด์ ๊ณ ๋ ค: ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ ์ฒ๋ฆฌ์์ ํ๋ซํผ๋ณ ์ฐจ์ด์ ์ ์ธ์ํ์ญ์์ค. ์ฝ๋๋ฅผ ์๋ก ๋ค๋ฅธ ํ๋ซํผ์์ ํ
์คํธํ์ฌ ์์๋๋ก ์๋ํ๋์ง ํ์ธํ์ญ์์ค. ํ๋ซํผ ๊ฐ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์์ ๋๋ ํฐ๋ฆฌ ๋ด์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด
os.path.join
์ ์ฌ์ฉํ์ญ์์ค. - ์์ธ ์ฒ๋ฆฌ: ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑํ๊ฑฐ๋ ์ก์ธ์คํ ๋ ๋ฐ์ํ ์ ์๋ ์์ธ์ ๋๋นํ์ญ์์ค. ์ฌ๊ธฐ์๋ ๊ถํ ๋ฌธ์ , ๋์คํฌ ๊ณต๊ฐ ๋ฌธ์ ๋๋ ๊ธฐํ ์๊ธฐ์น ์์ ์ค๋ฅ๋ฅผ ๋ํ๋ผ ์ ์๋
IOError
,OSError
๋ฐ ๊ธฐํ ์์ธ๊ฐ ํฌํจ๋ฉ๋๋ค. - ์ฝ๋ ๋ฌธ์ํ: ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ๋ช ํํ๊ฒ ๋ฌธ์ํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ์ฌ๋(๋ฐ ๋ฏธ๋์ ์์ )์ด ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ๋ฒ
์์ ํ์ผ ๋ช ๋ช ์ฌ์ฉ์ ์ ์
tempfile
๋ชจ๋์ ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ์ ์์ ํ๊ณ ์์์ ์ด๋ฆ์ ์ ๊ณตํ์ง๋ง ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง๊ฒ ๋ช
๋ช
๋ฐฉ์์ ์ฌ์ฉ์ ์ ์ํด์ผ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ผ ์ด๋ฆ์ ํ๋ก์ธ์ค ID ๋๋ ํ์ฌ ํ์์คํฌํ์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ ์ ์์ต๋๋ค.
tempfile
๋ชจ๋์ ํจ์์ os
, uuid
๋ฐ datetime
๊ณผ ๊ฐ์ ๋ค๋ฅธ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฒฐํฉํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค.
์์: ํ๋ก์ธ์ค ID ๋ฐ ํ์์คํฌํ๊ฐ ์๋ ์์ ํ์ผ ์์ฑ
import tempfile
import os
import datetime
process_id = os.getpid()
timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
prefix = f'process_{process_id}_{timestamp}_'
with tempfile.TemporaryFile(prefix=prefix) as temp_file:
print(temp_file.name)
# ํ์ผ ์ด๋ฆ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: /tmp/process_12345_20231027_103000_XXXXXX
์ฃผ์: ์์ ํ์ผ ์ด๋ฆ์ ์ฌ์ฉ์ ์ ์ํ ๋๋ ์์ธก ๊ฐ๋ฅํ๊ฑฐ๋ ์ฝ๊ฒ ์ถ์ธกํ ์ ์๋ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์ทจ์ฝ์ ์ ๋์ ํ์ง ์๋๋ก ์ฃผ์ํ์ญ์์ค. ์ด๋ฆ์ด ์ฌ์ ํ ์ถฉ๋ถํ ์์์ ์ด๊ณ ์์ ํ์ง ํ์ธํ์ญ์์ค.
ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํตํฉ
tempfile
๋ชจ๋์ ์์ ํ์ผ ๋๋ ๋๋ ํฐ๋ฆฌ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๋ค์ํ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ์ ์ํํ๊ฒ ํตํฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: Pillow, OpenCV): ์์ ํ์ผ์ ์ฌ์ฉํ์ฌ ์ค๊ฐ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ง์ง ์๋ ๋ํ ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๊ณผํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: pandas, NumPy): ์์ ํ์ผ์ ์ฌ์ฉํ์ฌ ๋ํ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ์ฅํ๊ฑฐ๋ ์์ ์ ์ฅ์ด ํ์ํ ๋ฐ์ดํฐ ๋ณํ์ ์ํํ ์ ์์ต๋๋ค.
- ์น ํ๋ ์์ํฌ(์: Django, Flask): ์์ ํ์ผ์ ์ฌ์ฉํ์ฌ ํ์ผ ์ ๋ก๋๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๋ณด๊ณ ์๋ฅผ ์์ฑํ๊ฑฐ๋, ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
- ํ ์คํธ ํ๋ ์์ํฌ(์: pytest, unittest): ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฉ๋ฆฌ๋ ํ ์คํธ ํ๊ฒฝ์ ๋ง๋ค๊ณ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
์์: Pillow์ ํจ๊ป tempfile
์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ์ฒ๋ฆฌ
from PIL import Image
import tempfile
# ์ํ ์ด๋ฏธ์ง ์์ฑ
image = Image.new('RGB', (500, 500), color='red')
with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as temp_file:
image.save(temp_file.name, 'PNG')
print(f'Image saved to temporary file: {temp_file.name}')
# ์ด๋ฏธ์ง ํ์ผ์ ๋ํ ์ถ๊ฐ ์์
์ํ
# (์: Pillow ๋๋ OpenCV๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋)
# ์๋ฃ๋๋ฉด ํ์ผ์ ์ญ์ ํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค(os.remove(temp_file.name))
import os
os.remove(temp_file.name)
ํ๋ซํผ ๊ฐ ๊ณ ๋ ค ์ฌํญ
์ฌ๋ฌ ์ด์ ์ฒด์ (์: Windows, macOS, Linux)์์ ์คํํด์ผ ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ๋๋ tempfile
๋ชจ๋์ ์ฌ์ฉํ ๋ ํ๋ซํผ ๊ฐ ํธํ์ฑ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ค์์ ๋ช ๊ฐ์ง ์ฃผ์ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค.
- ๊ฒฝ๋ก ๊ตฌ๋ถ ๊ธฐํธ: ํ์ฌ ํ๋ซํผ์ ์ ํฉํ ๊ฒฝ๋ก ๊ตฌ๋ถ ๊ธฐํธ(Unix ๊ณ์ด ์์คํ
์ ๊ฒฝ์ฐ
/
, Windows์ ๊ฒฝ์ฐ\
)๋ฅผ ์๋์ผ๋ก ์ฌ์ฉํ๋ฏ๋กos.path.join()
์ ์ฌ์ฉํ์ฌ ํ์ผ ๊ฒฝ๋ก๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. - ์์ ๋๋ ํฐ๋ฆฌ ์์น: ๊ธฐ๋ณธ ์์ ๋๋ ํฐ๋ฆฌ ์์น๊ฐ ํ๋ซํผ๋ง๋ค ๋ค๋ฅผ ์ ์์์ ์์๋์ญ์์ค. Unix ๊ณ์ด ์์คํ
์์๋ ์ผ๋ฐ์ ์ผ๋ก
/tmp
์ด๊ณ , Windows์์๋ ์ผ๋ฐ์ ์ผ๋กC:\Users\
์ ๋๋ค.\AppData\Local\Temp tempfile.gettempdir()
์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ์์น๋ฅผ ๊ฒฐ์ ํ๊ณ ์ฌ์ฉ์๊ฐ ํ๊ฒฝ ๋ณ์ ๋๋ ๊ตฌ์ฑ ํ์ผ์ ํตํด ์์ ๋๋ ํฐ๋ฆฌ ์์น๋ฅผ ๊ตฌ์ฑํ ์ ์๋๋ก ๊ณ ๋ คํ์ญ์์ค. - ํ์ผ ๊ถํ: ํ์ผ ๊ถํ ๋ชจ๋ธ์ Unix ๊ณ์ด ์์คํ
๊ณผ Windows ๊ฐ์ ์๋นํ ๋ค๋ฆ
๋๋ค. Unix ๊ณ์ด ์์คํ
์์๋
os.chmod()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ๊ถํ์ ์ค์ ํ ์ ์๋ ๋ฐ๋ฉด, Windows์์๋ ํ๋ซํผ๋ณ API ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ก์ธ์ค ์ ์ด ๋ชฉ๋ก(ACL)์ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. - ํ์ผ ์ ๊ธ: ํ์ผ ์ ๊ธ ๋ฉ์ปค๋์ฆ๋ ํ๋ซํผ๋ง๋ค ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์์ ํ์ผ ์ ๊ธ์ ๊ตฌํํด์ผ ํ๋ ๊ฒฝ์ฐ
fcntl
๋ชจ๋(Unix ๊ณ์ด ์์คํ ์ ๊ฒฝ์ฐ) ๋๋msvcrt
๋ชจ๋(Windows์ ๊ฒฝ์ฐ) ๋๋portalocker
์ ๊ฐ์ ํ๋ซํผ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
Tempfile์ ๋์
tempfile
์ ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ๊ฐ์ฅ ์ ํฉํ ์ ํ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง, ํน์ ์ํฉ์์๋ ๋ช ๊ฐ์ง ๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ๋ ์ ํฉํ ์ ์์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ์ดํฐ ๊ตฌ์กฐ: ์๋์ ๋ฐ์ดํฐ๋ง ์์๋ก ์ ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ ์์ ํ์ผ์ ์์ฑํ๋ ๋์ ๋ชฉ๋ก, ์ฌ์ ๋๋ ์งํฉ๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ํ์ผ I/O์ ์ค๋ฒํค๋๋ฅผ ํผํ๊ณ ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค(์: SQLite ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ชจ๋): ๋ ๋ณต์กํ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๊ฒ์ ์๊ตฌ ์ฌํญ์ ๊ฒฝ์ฐ SQLite์ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ชจ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์๊ตฌ์ ์ผ๋ก ์ ์ฅํ์ง ์๊ณ ๋ SQL ์ฟผ๋ฆฌ ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- Redis ๋๋ Memcached: ๋น ๋ฅด๊ณ ์์ฃผ ์ก์ธ์คํด์ผ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ๋ ค๋ฉด Redis ๋๋ Memcached์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ฌํ ์์คํ ์ ๊ณ ์ฑ๋ฅ ์บ์ฑ์ ์ํด ์ค๊ณ๋์์ผ๋ฉฐ ์บ์ฑ ๋ชฉ์ ์ผ๋ก ์์ ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
tempfile
๋ชจ๋์ Python์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ ๋ถ๋ถ์ด๋ฉฐ ์์ ํ์ผ ๋ฐ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ๊ณ ์์ ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํต์ฌ ๊ธฐ๋ฅ, ๋ณด์ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํ๋ฉด ํ๋ก์ ํธ์์ ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ์ฌ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ณ ํ์ผ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๋ฐ์ ์ธ ์์ ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ํญ์ ์๋ ์ ๋ฆฌ๋ฅผ ์ํด ์ปจํ
์คํธ ๊ด๋ฆฌ์(with
๋ฌธ)๋ฅผ ์ฌ์ฉํ๊ณ , ํ์์ ๋ฐ๋ผ ์ ์ ํ ํจ์(TemporaryFile
, NamedTemporaryFile
๋๋ TemporaryDirectory
)๋ฅผ ์ ํํ๊ณ , ํ๋ซํผ ๊ฐ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ํ๋ซํผ๋ณ ์ฐจ์ด์ ์ ์ธ์ํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.